package com.ruoyi.doword.utils;

import com.ruoyi.Config.TemplateFileProperties;
import freemarker.template.Configuration;
import freemarker.template.Template;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class WordUtil {




    //配置信息,代码本身写的还是很可读的,就不过多注解了
    private static Configuration configuration = null;
    // 这里注意的是利用WordUtils的类加载器动态获得模板文件的位置

    //private static final String templateFolder = wordUtils.class.getClassLoader().getResource("../../../../templates").getPath();
    private static final String templateFolder = WordUtil.class.getResource("/templates").getPath();

    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            System.out.println(templateFolder);
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private WordUtil() {
        throw new AssertionError();
    }

    /**
     * 导出excel
     *
     * @param request  请求对象
     * @param response 响应对象
     * @param map      word文档中参数
     * @param wordName 为模板的名字  例如xxx.ftl
     * @param fileName 是word 文件的名字 格式为："xxxx.doc"
     * @param name     是临时的文件夹米名称 string类型 可随意定义
     * @throws IOException
     */
    public static   Map<String, Object> exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String wordName, String fileName, String name) throws IOException {
        Template freemarkerTemplate = configuration.getTemplate(wordName);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        FileOutputStream fos = null;
        Document doc = null;
        try {
            // 调用工具类的createDoc方法生成Word文档
            file = createDoc(map, freemarkerTemplate, name);

            //todo 文件家
            //将生成的doc文件写到临时目录
            File dirTemp = new File("D:\\docHtml");
            if (!dirTemp.exists()) {
                dirTemp.mkdir();
            } else {
                deleteFiles("D:\\docHtml");
            }
            String docFileTempName = dirTemp.getAbsolutePath() + "/" + UUID.randomUUID().toString() + ".doc";
            String pdfFileTemp = dirTemp.getAbsolutePath() + "/" + UUID.randomUUID().toString() + ".pdf";
            String htmlFileName = UUID.randomUUID().toString() + ".html";
            String htmlFileTemp = dirTemp.getAbsolutePath() + "/" + htmlFileName;
            fin = new FileInputStream(file);
            UUID uuid = UUID.randomUUID();
            fos = new FileOutputStream(docFileTempName);
            byte[] buffer = new byte[512];// 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesToRead);
            }
            //将临时目录的doc文件转成pdf格式
            // 加载DOC文件
            doc = new Document(docFileTempName);
            // 保存为PDF文件
            doc.save(pdfFileTemp, SaveFormat.PDF);

//            //将临时目录的doc文件转成html格式
//            doc.save(htmlFileTemp, SaveFormat.HTML);


            //将doc文件上传到阿里云OSS服务器

            AliOSSUtils aliOSSUtils = new AliOSSUtils();
//            String wordPath = aliOSSUtils.uploadWord(file);
            //删除临时目录的doc
            File docTemp = new File(docFileTempName);
            docTemp.delete();

            //将pdf文件上传到阿里云OSS服务器
            File filePdf = new File(pdfFileTemp);
            String pdfPath = aliOSSUtils.uploadPdf(filePdf);
            //删除临时目录的pdf
            File pdfTemp = new File(pdfFileTemp);
            pdfTemp.delete();

            Map<String, Object> result = new HashMap<>();
//            result.put("wordUrl", wordPath);
            result.put("pdfUrl", pdfPath);
//            result.put("htmlUrl", htmlFileName);
            return result;

//            fin = new FileInputStream(file);
//            response.setCharacterEncoding("utf-8");
//            response.setContentType("application/x-download");
//            fileName = new String(fileName.getBytes(), "ISO-8859-1");
//            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(fileName)));
//            out = response.getOutputStream();
//            byte[] buffer = new byte[512];// 缓冲区
//            int bytesToRead = -1;
//            // 通过循环将读入的Word文件的内容输出到浏览器中
//            while((bytesToRead = fin.read(buffer)) != -1) {
//                out.write(buffer, 0, bytesToRead);
//            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (fin != null) fin.close();
            if (out != null) out.close();
            if (fos != null) fos.close();
            if (doc != null) {
                try {
                    doc.cleanup();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            if (file != null) file.delete();// 删除临时文件
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template, String name) {
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }

    public static void deleteFiles(String directoryPath) {
        File directory = new File(directoryPath);

        if (directory.exists()) {
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        deleteFiles(file.getAbsolutePath());
                    } else {
                        file.delete();
                    }
                }
            }
        }
    }
}
